热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

调头|楷体_2021年MathorCup数学建模A题自动驾驶中的车辆调头问题全过程解题论文及程序

篇首语:本文由编程笔记#小编为大家整理,主要介绍了2021年MathorCup数学建模A题自动驾驶中的车辆调头问题全过程解题论文及程序相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了2021年MathorCup数学建模A题自动驾驶中的车辆调头问题全过程解题论文及程序相关的知识,希望对你有一定的参考价值。


2021年MathorCup数学建模A题自动驾驶中的车辆调头问题全过程解题标准论文及程序
  自动驾驶是近年人工智能应用的热门研究领域之一,其中调头是自动驾驶中一个非常实际又很有趣的场景。假设无人车为四轮乘用车,采用前轮转向后轮驱动;车身可认为是一个矩形,车长 5 米,车宽 2 米,轴距 2.8米;方向盘最大转角 470°,方向盘与前轮转角的传动比为 16:1(方向盘每转动 16°,前轮转动 1°),方向盘最大转速为 400°/s;最大油门加速度 3m/s`2,极限刹车加速度-5m/s^2。
  无人车的轨迹,指的是一条含有位置和时间等信息的曲线,它由一列轨迹点构成,各个轨迹点中应包含位置坐标、方向角、曲率、曲率变化率、速度、加速度及运动到此点时的时间等信息。这里轨迹指的是车身中某一特定点的轨迹,即控制点。控制点是事先选定的,通常位于无人车车身对称轴(车身可以近似认为是左右轴对称的)上的一点,在行驶时,控制点的位置会与轨迹点相重合,控制点处的速度方向将与轨迹点的方向角一致。由于无人车的车辆动力学性质和安全性要求,轨迹必须满足以下条件:
  (1)任何点的加速度不得高于最大油门加速度,不得低于极限刹车减速度;
  (2)无人车朝向和方向盘转角都不能突变,轨迹线必须是连续、且切线方向连续,当无人车不是静止时,曲率也必须连续(静止时可以原地打方向,非静止时不能);
  (3)轨迹线的最大曲率应尽量不高于 0.205,禁止高于 0.21;
  (4)按轨迹行驶时,在调头完成之前,无人车车身任何点不得与任何障碍物或者掉头区域边界发生碰撞,且与障碍物至少保留一个最小安全距离,一般不小于 30cm。
  无人车调头轨迹在保证上述条件之外也应具备尽可能舒适的驾乘体感,以及具备尽可能高的通行效率,同时出于规范驾驶的考虑,尽量减少不必要的压车道线行驶。
  请参赛者按照下面问题中简化版的无人车调头场景和附件数据,建立无人车安全快速调头的数学模型,设计无人车调头轨迹的计算方法,在输入外部道路和障碍物信息后,计算出合理可行的无人车轨迹。同时,由于附近障碍物可能由于视野问题被遮挡,导致调头中周围环境信息发生变化,轨迹应当是可以实时更新的。附件数据文件中的边界线均表示为折线点列,按坐标点从上到下的顺序连接形成;所有障碍物均以多边形表示,其中的点均按逆时针顺序排列,路况简图见数据文件。请你们的参赛队完成以下问题:
  问题 1:如图 1 所示场景,无人车(用橙色矩形表示)正在最左侧车道准备调头,存在三个对向车道。附件数据文件中,掉头区域边界以红色边框 A 表示,两条对向车道线以 B、C 表示(均为路面上的虚线),中间的隔离障碍物以 D 表示。无人车起始位置已经在附件数据文件中给出,当无人车身触碰到对向的掉头区域边界(图 1 中绿色部分)时,认为调头完成。请阐述控制点位置,解释其理由;基于此建立无人车调头的数学模型,并给出一个合理可行的算法设计,给出调头轨迹。

  问题 2:当掉头区域狭窄时,判断什么样的场景下无人车能够在不倒车的情况下完成调头,什么情况需要至少一次倒车(如图 2 场景 2,蓝色箭头表示向前,红色箭头表示倒车)才能通过。建立相应的无人车调头的数学模型,给出合理的算法设计,并给出仿真结果。


  问题 3:如图 3 场景,如果道路上还存在其它静止障碍物(附件数据文件中以 F 和 G 表示),当仅存在 F、仅存在 G、或二者都存在时,建立相应的无人车调头的数学模型,给出合理的算法设计,并给出调头轨迹,你的算法应明确如何进行避障?

  问题 4:按交规规定,如果道路上存在人行横道即斑马线,其所占区域在附件数据文件中以 E 表示,则无人车需要尽可能在不压人行横道的情况下通过,如果无法做到,则需要越过(后轮越过)人行横道后再开始调头,禁止骑人行横道调头(如图 4 场景 4 所示)。其中标识“√”的为可行通行方式,标识“×”为骑人行道调头方式。建立相应的无人车调头的数学模型,给出合理的算法设计和相应的调头轨迹;当斑马线和障碍物同时存在时(如图 5 场景 5 所示),你的模型和算法如何同时满足交规并进行避障绕行?


  问题 5:无人车在实际路况行驶中进行调头时,道路中的障碍物通常是处于移动状态,如对向来车等,针对图 3 和图 5 的两种场景,假设图中标识的障碍物位置为无人车处在起始时刻的初始位置,障碍物以一定的速度移动,假设只考虑与道路平行方向移动,请建立更一般的无人车调头轨迹规划模型并给出相应算法设计和无人车调头策略,给出仿真结果。
  问题 6:为保证无人驾驶的安全性,无人车的轨迹规划算法必须拥有尽可能高的求解成功率(应倾向使用更收敛更稳定,失败率更低的计算方法)同时为了能对路况进行快速反应,需要以尽可能高的频率进行计算(计算复杂度尽量低)。你的算法如何在求解成功率和求解耗时这两方面优化?

问题分析:
  在交会几何和预测观测车辆行驶轨迹的前提下,我们构建了一个基于约束条件的轨迹模型。现有的控制算法是以点线式车辆-道路模型进行设计,忽略车辆与道路形状之间的实际差异,利用参数化曲线[5]表示道路轨迹,车辆根据参数化曲线以及自身状态做出转向动作。
  针对问题一:在基于交会几何和预测观测车辆行驶轨迹的前提下,结合车辆行驶动力学模型和转弯时的侧向动力模型,我们构建了一个基于约束条件的轨迹模型。其中,车辆侧向受力时,从车辆侧向、横摆两个自由度进行运动。而且车辆在转弯时,需考虑转弯半径、速度,安全距离等因素。由题设条件可知:加速度、车宽、车道宽度、传动比等为定值,所以我们采用界定分析法确定车辆行驶的轨迹区域,选取加速度、最大曲率、安全距离等作为约束条件,在已有的地图模型基础上建立轨迹预测模型,并用 MATLAB 中的 Automated Driving Toolbox进行仿真。只要运动轨迹满足界定区域 1、3 之间就可以完成避障且实现转弯。
  针对问题二:在问题一的基础上,已知曲率决定转弯半径,方向盘转角决定的是车转弯时轨迹半径的极限值。而车在转弯时,是否需要倒车的条件是由路宽、车距、最小曲率半径所决定的。这里,我们采用路径规划算法对轨迹进行预测,寻找其界限值。由题设条件可知,临界值由安全距离、最小半径、车宽三者共同决定。根据经验可知,当最小半径都不满足一次性转弯时,那么就必须倒车。同时,也将最小半径设为界定值。
  针对问题三:依据题干条件设定两个场景,场景一为仅存在 F 或 G 障碍物;场景二为障碍物 F、G 同时都存在。依据动力学原理,建立无人车运动的非完整约束模型和行驶过程中的速度约束方。基于障碍项、曲率项、光滑项、场函数构建损失函数,并将其作为优化对象。通过寻找约束条件进行非线性规划建模,并采用hybirdA算法实现其路径规划。
  针对问题四:利用问题二中得到的约束条件和附件数据计算出最小转弯半径,用 AutoCAD 建立地图模型。在此基础上,进一步判断当道路中存在人行道时,求解无人车不压线通过的临界值。通过路径规划法计算出无人车在满足安全距离、交规等约束条件下的最短路径,使用 MATLAB 进行仿真得到轨迹模型。基于问题三的优化模型和搜索方式,重置地图坐标。
  针对问题五:无人车避障主要是利用先进的传感技术来增强无人车的感知能力,将感知系统获取的车速、位置等实时信息反馈给系统,同时根据路况与车流的综合信息判断和分析潜在的安全隐患。依据题设条件,我们将来往车辆与无人车的速度进行归一化处理,即将来往车辆(动态障碍)与无人车间的速度差通过补偿,使其与动态障碍物处以一种相对静止的状态。此时,无人车的搜索路径便取决于距离障碍物的远近,由此建立障碍物位置变化约束方程。
  针对问题六:结合以上五个模型以及从算法复杂度和耗时率两方面考虑,分析其hybirdA算法的优点及局限性。

模型的建立与求解:
  转向条件
  保证无人车在转弯过程中,车轮与地面之间是纯滚动,需符合 Ackerman 转向方程:


转弯几何原理
绘制出无人车转向过程中前轮摆角、车身结构和两后轮中心处轨迹半径以及整车重心处轨迹半径的几何关系,则有

转向速度与转向加速度对转弯的影响:

基于上述条件,选取无人车两后轮连线的中点作为控制点,理由如下:
绘制无人车转弯过程如图 1 所示,将无人车后轮中点设为 Q,根据图中几何关系

内外侧轮胎的转向半径不同,联立公式(1)和公式(3)得

综上无人车行驶任意时刻的位置都可以用 Q 点的位置坐标和该点车身与水平方向的夹角θ来表示,因此选取 Q 为控制点。

选取 Q 点为控制点后,采用界定分析法来确定轨迹区域,即给出所有约束条件则在非约束区域就是无人车运动轨迹。


论文缩略图:

程序代码:

function [allData, scenario, sensor] = ds__4()
%ds__4 - Returns sensor detections
% allData = ds__4 returns sensor detections in a structure
% with time for an internally defined scenario and sensor suite. %
% [allData, scenario, sensors] = ds__4 optionally returns
% the drivingScenario and detection generator objects. % Generated by MATLAB(R) 9.8 (R2020a) and Automated Driving Toolbox 3.1 (R2020a). % Generated on: 18-Apr-2021 12:13:54
% Create the drivingScenario object and ego car
[scenario, egoVehicle] = createDrivingScenario;
% Create all the sensors
sensor = createSensor(scenario);
allData = struct('Time', , 'ActorPoses', , 'ObjectDetections', , 'LaneDetections', );
running = true;
while runnin
% Generate the target poses of all actors relative to the ego vehicle
poses = targetPoses(egoVehicle);
time = scenario.SimulationTime;
% Generate detections for the sensor
laneDetections = [];
[objectDetections, numObjects, isValidTime] = sensor(poses, time);
objectDetections = objectDetections(1:numObjects);
% Aggregate all detections into a structure for later use
if isValidTime
allData(end &#43; 1) &#61; struct( ... &#39;Time&#39;, scenario.SimulationTime, ... &#39;ActorPoses&#39;, actorPoses(scenario), ... &#39;ObjectDetections&#39;, objectDetections, ... &#39;LaneDetections&#39;, laneDetections); %#ok<AGROW>
end
% Advance the scenario one time step and exit the loop if the scenario is complete
running &#61; advance(scenario);
end
% Restart the driving scenario to return the actors to their initial positions. restart(scenario);
% Release the sensor object so it can be used again. release(sensor);
%%%%%%%%%%%%%%%%%%%%
% Helper functions %
%%%%%%%%%%%%%%%%%%%%
% Units used in createSensors and createDrivingScenario
% Distance/Position - meters
% Speed - meters/second
% Angles - degrees
% RCS Pattern - dBsm
function sensor &#61; createSensor(scenario)
% createSensors Returns all sensor objects to generate detections
% Assign into each sensor the physical and radar profiles for all actors
profiles &#61; actorProfiles(scenario);
sensor &#61; visionDetectionGenerator(&#39;SensorIndex&#39;, 1, ...
&#39;SensorLocation&#39;, [4 0], ... &#39;MaxRange&#39;, 100, ... &#39;DetectorOutput&#39;, &#39;Objects only&#39;, ... &#39;Intrinsics&#39;, cameraIntrinsics([1814.81018227767 1814.81018227767],[320 240],[480
640]), ... &#39;ActorProfiles&#39;, profiles);
function [scenario, egoVehicle] &#61; createDrivingScenario
% createDrivingScenario Returns the drivingScenario defined in the Designer
% Construct a drivingScenario object. scenario &#61; drivingScenario;
% Add all road segments
roadCenters &#61; [31.476 -5 0;
0 -5 0];
laneSpecification &#61; lanespec(3, &#39;Width&#39;, 3.4872);
road(scenario, roadCenters, &#39;Lanes&#39;, laneSpecification);
roadCenters &#61; [31.476 -12.507 0;
0 -12.507 0];
laneSpecification &#61; lanespec(1, &#39;Width&#39;, 4.5517);
road(scenario, roadCenters, &#39;Lanes&#39;, laneSpecification);
% Add the actors
actor(scenario, ... &#39;ClassID&#39;, 5, ... &#39;Length&#39;, 16.0256, ... &#39;Width&#39;, 1.5434, ... &#39;Height&#39;, 0.8, ... &#39;Position&#39;, [8.12 -11.05 0.01], ... &#39;PlotColor&#39;, [0 114 189] / 255);
actor(scenario, ... &#39;ClassID&#39;, 5, ... &#39;Length&#39;, 4.9, ... &#39;Width&#39;, 4.9998, ... &#39;Height&#39;, 0.8, ... &#39;Position&#39;, [-171.8 46.5 0], ... &#39;PlotColor&#39;, [0 255 0] / 255);
actor(scenario, ... &#39;ClassID&#39;, 5, ... &#39;Length&#39;, 8.2223, ...
&#39;Width&#39;, 1.8998, ... &#39;Height&#39;, 0.8, ... &#39;Position&#39;, [-169.7 -11 0], ... &#39;PlotColor&#39;, [0 255 0] / 255);
% Add the ego vehicle
egoVehicle &#61; vehicle(scenario, ... &#39;ClassID&#39;, 1, ... &#39;Length&#39;, 5, ... &#39;Width&#39;, 2, ... &#39;Position&#39;, [5.89 -13.39 0.01], ... &#39;PlotColor&#39;, [0.85 0.325 0.098]);
waypoints &#61; [5.89 -13.39 0.01;
13.62 -13.46 0.01;
16.25 -13.46 0.01;
19.51 -13.11 0.01;
26.74 -10.41 0.01;
27.31 -9.14 0.01;
27.31 -7.72 0.01;
26.67 -6.02 0.01;
25.18 -4.46 0.01;
22.84 -3.32 0.01;
20.36 -3.11 0.01;
17.81 -3.96 0.01;
14.62 -6.16 0.01;
11.99 -7.36 0.01;
7.95 -8.21 0.01;
3.27 -8.21 0.01;
0.15 -8.21 0.01; -3.04 -8.21 0];
speed &#61; 30;
trajectory(egoVehicle, waypoints, speed);
vehicle(scenario, ... &#39;ClassID&#39;, 1, ... &#39;Length&#39;, 4.9, ... &#39;Width&#39;, 4.9998, ... &#39;Position&#39;, [9.51 -2.19 0.01], ... &#39;PlotColor&#39;, [0.929 0.694 0.125])
vehicle(scenario, ... &#39;ClassID&#39;, 1, ... &#39;Length&#39;, 8.2223, ... &#39;Width&#39;, 1.8998, ...
&#39;Position&#39;, [17.03 -8.15 0.01], ... &#39;PlotColor&#39;, [0.494 0.184 0.556]);
function [allData, scenario, sensor] &#61; ds__4()
%ds__4 - Returns sensor detections
% allData &#61; ds__4 returns sensor detections in a structure
% with time for an internally defined scenario and sensor suite. %
% [allData, scenario, sensors] &#61; ds__4 optionally returns
% the drivingScenario and detection generator objects. % Generated by MATLAB(R) 9.8 (R2020a) and Automated Driving Toolbox 3.1 (R2020a). % Generated on: 18-Apr-2021 12:16:07
% Create the drivingScenario object and ego car
[scenario, egoVehicle] &#61; createDrivingScenario;
% Create all the sensors
sensor &#61; createSensor(scenario);
allData &#61; struct(&#39;Time&#39;, , &#39;ActorPoses&#39;, , &#39;ObjectDetections&#39;, , &#39;LaneDetections&#39;, );
running &#61; true;
while running
% Generate the target poses of all actors relative to the ego vehicle
poses &#61; targetPoses(egoVehicle);
time &#61; scenario.SimulationTime;
% Generate detections for the sensor
laneDetections &#61; [];
[objectDetections, numObjects, isValidTime] &#61; sensor(poses, time);
objectDetections &#61; objectDetections(1:numObjects);
% Aggregate all detections into a structure for later use
if isValidTime
allData(end &#43; 1) &#61; struct( ... &#39;Time&#39;, scenario.SimulationTime, ... &#39;ActorPoses&#39;, actorPoses(scenario), ... &#39;ObjectDetections&#39;, objectDetections, ... &#39;LaneDetections&#39;, laneDetections); %#ok<AGROW>
end
% Advance the scenario one time step and exit the loop if the scenario is complete
running &#61; advance(scenario);
end

推荐阅读
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • iOS开启Google位置服务器和显示定位权限的方法
    本文介绍了在iOS开发中如何开启Google位置服务器和显示定位权限的方法,包括导入CoreLocation和MapKit库、在界面导入头文件和在info.plist文件中添加授权等步骤。同时还介绍了iOS11中NSLocationAlwaysAndWhenInUseUsageDescription的功能变化。阅读本文可以帮助开发者了解如何在iOS应用中使用Google位置服务器和处理定位权限相关的问题。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 当google在搜索上很成功,并购youtube、发布gmail、进入手机、一统地图的时候,我们说google真伟大。当苹果在mp3领域一骑绝尘,iphone秒杀诺基亚,ipad打倒了电子 ... [详细]
  • pc电脑如何投屏到电视?DLNA主要步骤通过DLNA连接,使用WindowsMediaPlayer的流媒体播放举例:电脑和电视机都是连接的 ... [详细]
author-avatar
我要公道2602932023
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有